using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DFeatures._Conversion
{
    /// <summary>
    /// <para>ASCII 3D To Feature Class</para>
    /// <para>Imports 3D features from one or more ASCII files stored in XYZ, XYZI, or GENERATE formats into a new feature class.</para>
    /// <para>将以 XYZ、XYZI 或 GENERATE 格式存储的一个或多个 ASCII 文件中的 3D 要素导入到新要素类中。</para>
    /// </summary>    
    [DisplayName("ASCII 3D To Feature Class")]
    public class ASCII3DToFeatureClass : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ASCII3DToFeatureClass()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input">
        /// <para>ASCII 3D Data</para>
        /// <para><xdoc>
        ///   <para>The ASCII files or folders containing data in XYZ, XYZI (with lidar intensity), or 3D GENERATE format. All input files must be in the same format. If a folder is specified, the File Suffix parameter becomes required, and all the files that have the same extension as the specified suffix will be processed.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>包含 XYZ、XYZI（激光雷达强度）或 3D GENERATE 格式数据的 ASCII 文件或文件夹。所有输入文件必须采用相同的格式。如果指定了文件夹，则文件后缀参数变为必需，并且将处理与指定后缀具有相同扩展名的所有文件。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_file_type">
        /// <para>File Format</para>
        /// <para><xdoc>
        ///   <para>The format of the ASCII files that will be converted to a feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>XYZ—Text file that contain geometry information stored as XYZ coordinates.</bullet_item><para/>
        ///     <bullet_item>XYZI—Text files that contain XYZ coordinates alongside intensity measurements.</bullet_item><para/>
        ///     <bullet_item>Generate—Text files structured in the Generate format.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将转换为要素类的 ASCII 文件的格式。</para>
        ///   <bulletList>
        ///     <bullet_item>XYZ - 包含存储为 XYZ 坐标的几何信息的文本文件。</bullet_item><para/>
        ///     <bullet_item>XYZI - 包含 XYZ 坐标和强度测量值的文本文件。</bullet_item><para/>
        ///     <bullet_item>生成 （Generate） - 以“生成”（Generate） 格式结构化的文本文件。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// </param>
        /// <param name="_out_geometry_type">
        /// <para>Output Feature Class Type</para>
        /// <para><xdoc>
        ///   <para>The geometry type of the output feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>Multipoint features—Multipoints are recommended the input data contains a large number of points and attributes per feature are not required.</bullet_item><para/>
        ///     <bullet_item>Point features—Each XYZ coordinate will produce one point feature.</bullet_item><para/>
        ///     <bullet_item>Polyline features—The output will contain polyline features.</bullet_item><para/>
        ///     <bullet_item>Polygon features—The output will contain polygon features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出要素类的几何类型。</para>
        ///   <bulletList>
        ///     <bullet_item>多点要素 - 建议使用多点：输入数据包含大量点，并且不需要每个要素的属性。</bullet_item><para/>
        ///     <bullet_item>点要素—每个 XYZ 坐标将生成一个点要素。</bullet_item><para/>
        ///     <bullet_item>折线要素 - 输出将包含折线要素。</bullet_item><para/>
        ///     <bullet_item>面要素—输出将包含面要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public ASCII3DToFeatureClass(List<object> _input, _in_file_type_value _in_file_type, object _out_feature_class, _out_geometry_type_value _out_geometry_type)
        {
            this._input = _input;
            this._in_file_type = _in_file_type;
            this._out_feature_class = _out_feature_class;
            this._out_geometry_type = _out_geometry_type;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "ASCII 3D To Feature Class";

        public override string CallName => "3d.ASCII3DToFeatureClass";

        public override List<string> AcceptEnvironments => ["XYResolution", "XYTolerance", "ZResolution", "ZTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_input, _in_file_type.GetGPValue(), _out_feature_class, _out_geometry_type.GetGPValue(), _z_factor, _input_coordinate_system, _average_point_spacing, _file_suffix, _decimal_separator.GetGPValue()];

        /// <summary>
        /// <para>ASCII 3D Data</para>
        /// <para><xdoc>
        ///   <para>The ASCII files or folders containing data in XYZ, XYZI (with lidar intensity), or 3D GENERATE format. All input files must be in the same format. If a folder is specified, the File Suffix parameter becomes required, and all the files that have the same extension as the specified suffix will be processed.</para>
        ///   <para>In the tool dialog box, a folder can also be specified as an input by selecting the folder in Windows Explorer and dragging it onto the parameter's input box.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>包含 XYZ、XYZI（激光雷达强度）或 3D GENERATE 格式数据的 ASCII 文件或文件夹。所有输入文件必须采用相同的格式。如果指定了文件夹，则文件后缀参数变为必需，并且将处理与指定后缀具有相同扩展名的所有文件。</para>
        ///   <para>在工具对话框中，还可以通过在 Windows 资源管理器中选择文件夹并将其拖动到参数的输入框中，将文件夹指定为输入。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("ASCII 3D Data")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _input { get; set; }


        /// <summary>
        /// <para>File Format</para>
        /// <para><xdoc>
        ///   <para>The format of the ASCII files that will be converted to a feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>XYZ—Text file that contain geometry information stored as XYZ coordinates.</bullet_item><para/>
        ///     <bullet_item>XYZI—Text files that contain XYZ coordinates alongside intensity measurements.</bullet_item><para/>
        ///     <bullet_item>Generate—Text files structured in the Generate format.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将转换为要素类的 ASCII 文件的格式。</para>
        ///   <bulletList>
        ///     <bullet_item>XYZ - 包含存储为 XYZ 坐标的几何信息的文本文件。</bullet_item><para/>
        ///     <bullet_item>XYZI - 包含 XYZ 坐标和强度测量值的文本文件。</bullet_item><para/>
        ///     <bullet_item>生成 （Generate） - 以“生成”（Generate） 格式结构化的文本文件。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("File Format")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _in_file_type_value _in_file_type { get; set; }

        public enum _in_file_type_value
        {
            /// <summary>
            /// <para>XYZ</para>
            /// <para>XYZ—Text file that contain geometry information stored as XYZ coordinates.</para>
            /// <para>XYZ - 包含存储为 XYZ 坐标的几何信息的文本文件。</para>
            /// </summary>
            [Description("XYZ")]
            [GPEnumValue("XYZ")]
            _XYZ,

            /// <summary>
            /// <para>XYZI</para>
            /// <para>XYZI—Text files that contain XYZ coordinates alongside intensity measurements.</para>
            /// <para>XYZI - 包含 XYZ 坐标和强度测量值的文本文件。</para>
            /// </summary>
            [Description("XYZI")]
            [GPEnumValue("XYZI")]
            _XYZI,

            /// <summary>
            /// <para>Generate</para>
            /// <para>Generate—Text files structured in the Generate format.</para>
            /// <para>生成 （Generate） - 以“生成”（Generate） 格式结构化的文本文件。</para>
            /// </summary>
            [Description("Generate")]
            [GPEnumValue("GENERATE")]
            _GENERATE,

        }

        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Output Feature Class Type</para>
        /// <para><xdoc>
        ///   <para>The geometry type of the output feature class.</para>
        ///   <bulletList>
        ///     <bullet_item>Multipoint features—Multipoints are recommended the input data contains a large number of points and attributes per feature are not required.</bullet_item><para/>
        ///     <bullet_item>Point features—Each XYZ coordinate will produce one point feature.</bullet_item><para/>
        ///     <bullet_item>Polyline features—The output will contain polyline features.</bullet_item><para/>
        ///     <bullet_item>Polygon features—The output will contain polygon features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出要素类的几何类型。</para>
        ///   <bulletList>
        ///     <bullet_item>多点要素 - 建议使用多点：输入数据包含大量点，并且不需要每个要素的属性。</bullet_item><para/>
        ///     <bullet_item>点要素—每个 XYZ 坐标将生成一个点要素。</bullet_item><para/>
        ///     <bullet_item>折线要素 - 输出将包含折线要素。</bullet_item><para/>
        ///     <bullet_item>面要素—输出将包含面要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _out_geometry_type_value _out_geometry_type { get; set; }

        public enum _out_geometry_type_value
        {
            /// <summary>
            /// <para>Point features</para>
            /// <para>Point features—Each XYZ coordinate will produce one point feature.</para>
            /// <para>点要素—每个 XYZ 坐标将生成一个点要素。</para>
            /// </summary>
            [Description("Point features")]
            [GPEnumValue("POINT")]
            _POINT,

            /// <summary>
            /// <para>Multipoint features</para>
            /// <para>Multipoint features—Multipoints are recommended the input data contains a large number of points and attributes per feature are not required.</para>
            /// <para>多点要素 - 建议使用多点：输入数据包含大量点，并且不需要每个要素的属性。</para>
            /// </summary>
            [Description("Multipoint features")]
            [GPEnumValue("MULTIPOINT")]
            _MULTIPOINT,

            /// <summary>
            /// <para>Polyline features</para>
            /// <para>Polyline features—The output will contain polyline features.</para>
            /// <para>折线要素 - 输出将包含折线要素。</para>
            /// </summary>
            [Description("Polyline features")]
            [GPEnumValue("POLYLINE")]
            _POLYLINE,

            /// <summary>
            /// <para>Polygon features</para>
            /// <para>Polygon features—The output will contain polygon features.</para>
            /// <para>面要素—输出将包含面要素。</para>
            /// </summary>
            [Description("Polygon features")]
            [GPEnumValue("POLYGON")]
            _POLYGON,

        }

        /// <summary>
        /// <para>Z Factor</para>
        /// <para>The factor by which z-values will be multiplied. This is typically used to convert z linear units to match x,y linear units. The default is 1, which leaves elevation values unchanged. This parameter is not available if the spatial reference of the input surface has a z datum with a specified linear unit.</para>
        /// <para>z 值将乘以的因子。这通常用于转换 z 线性单位以匹配 x，y 线性单位。默认值为 1，使高程值保持不变。如果输入曲面的空间参考具有具有指定线性单位的 z 基准面，则此参数不可用。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_factor { get; set; } = 1;


        /// <summary>
        /// <para>Coordinate System</para>
        /// <para>The coordinate system of the input data. The default is an Unknown Coordinate System. If specified, the output may or may not be projected into a different coordinate system. This depends the whether the geoprocessing environment has a coordinate system defined for the location of the target feature class.</para>
        /// <para>输入数据的坐标系。默认值为未知坐标系。如果指定，则输出可能会或可能不会投影到不同的坐标系中。这取决于地理处理环境是否为目标要素类的位置定义了坐标系。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _input_coordinate_system { get; set; } = null;


        /// <summary>
        /// <para>Average Point Spacing</para>
        /// <para>The average planimetric distance between points of the input. This parameter is only used when the output geometry is set to MULTIPOINT, and its function is to provide a means for grouping the points together. This value is used in conjunction with the points per shape limit to construct a virtual tile system used to group the points. The tile system's origin is based on the domain of the target feature class. Specify the spacing in the horizontal units of the target feature class.</para>
        /// <para>输入点之间的平均平面距离。仅当输出几何设置为 MULTIPOINT 时才使用此参数，其功能是提供将点组合在一起的方法。此值与每个形状的点数限制结合使用，以构建用于对点进行分组的虚拟切片系统。切片系统的原点基于目标要素类的属性域。以目标要素类的水平单位指定间距。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Average Point Spacing")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _average_point_spacing { get; set; } = null;


        /// <summary>
        /// <para>File Suffix</para>
        /// <para>The suffix of the files that will be imported from an input folder. This parameter is required when a folder is specified as input.</para>
        /// <para>将从输入文件夹导入的文件的后缀。当文件夹指定为输入时，此参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("File Suffix")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _file_suffix { get; set; } = null;


        /// <summary>
        /// <para>Decimal Separator</para>
        /// <para><xdoc>
        ///   <para>The decimal character that will be used in the text file to differentiate the integer of a number from its fractional part.</para>
        ///   <bulletList>
        ///     <bullet_item>Point—A point will be used as the decimal character. This is the default.</bullet_item><para/>
        ///     <bullet_item>Comma—A comma will be used as the decimal character.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>将在文本文件中用于区分数字的整数与其小数部分的十进制字符。</para>
        ///   <bulletList>
        ///     <bullet_item>点—点将用作十进制字符。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>逗号—逗号将用作十进制字符。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Decimal Separator")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _decimal_separator_value _decimal_separator { get; set; } = _decimal_separator_value._DECIMAL_POINT;

        public enum _decimal_separator_value
        {
            /// <summary>
            /// <para>Point</para>
            /// <para>Point—A point will be used as the decimal character. This is the default.</para>
            /// <para>点—点将用作十进制字符。这是默认设置。</para>
            /// </summary>
            [Description("Point")]
            [GPEnumValue("DECIMAL_POINT")]
            _DECIMAL_POINT,

            /// <summary>
            /// <para>Comma</para>
            /// <para>Comma—A comma will be used as the decimal character.</para>
            /// <para>逗号—逗号将用作十进制字符。</para>
            /// </summary>
            [Description("Comma")]
            [GPEnumValue("DECIMAL_COMMA")]
            _DECIMAL_COMMA,

        }

        public ASCII3DToFeatureClass SetEnv(object XYResolution = null, object XYTolerance = null, object ZResolution = null, object ZTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYResolution: XYResolution, XYTolerance: XYTolerance, ZResolution: ZResolution, ZTolerance: ZTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}